Johnson算法是壹種用于解決邊數與節點數之間關系爲O(n^2)的帶權圖的最短路徑問題的算法。它是壹種結合了Dijkstra算法和Bellman-Ford算法的技術,通過使用壹個負權重的環檢測器來消除負權重的影響。這種算法的時間複雜度爲O(n^2+m log n)。
Johnson算法是壹種用于解決多源最短路徑問題的算法。它通過將圖中的邊權轉換爲虛擬起點的邊權來解決問題。
Johnson算法的壹個明顯缺點是,在邊權取負值之後,有負權邊的圖上不能使用該算法。這是因爲負權邊會導致最長路徑不存在。另外,Johnson算法的時間複雜度爲O(n^2 * log(n) + m * log(n)),其中n爲頂點數,m爲邊數。相比于其他多源最短路徑算法,Johnson算法的時間複雜度較高。還有壹點就是Johnson算法需要先對圖做壹個Bellman-Ford或者Dijkstra來判斷負環,並且需要多次使用堆優化的Dijkstra算法,所以空間複雜度也比較大。
例如,假設有壹個圖,其中包含5個節點(A、B、C、D、E)和7條邊(A-B、B-C、C-D、D-E、A-D、B-E、C-E)。現在,如果要求從A、B、C三個起點到E終點的最短路徑,可以使用Johnson算法。
首先,將虛擬起點S加入圖中,並將S到A、B、C的邊權設爲0。然後,使用Bellman-Ford算法求S到其他各點的最短路徑。接著,將圖中所有邊權加上S到該邊的兩個端點的最短路徑長度。最後,使用Dijkstra算法求A、B、C到E的最短路徑。
在這個例子中,Johnson算法將會得到A到E、B到E、C到E的最短路徑分別爲 [A,D,E], [B,E]。